﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Problem2
{
    class Backtracking
    {
        public static void printFig(coordenadas[] coords)
        {
            int[][] fig = new int[5][];
            for (int i = 0; i < fig.Length; i++)
            {
                fig[i] = new int[5];
                for (int j = 0; j < 5; j++)
                    fig[i][j] = 0;
            }
            for (int i = 0; i < coords.Length; i++)
            {
                fig[coords[i].GetY()][coords[i].GetX()] = 1;
            }
            for (int i = 0; i < fig.Length; i++)
            {
                for (int j = 0; j < fig[i].Length; j++)
                    Console.Write(fig[i][j].ToString() + "|");
                Console.WriteLine("");
            }

        }
        public static void backtracking(Tablero tab, coordenadas coord, coordenadas[][] piezasEnTablero,
            ref int cantSoluciones, HashSet<String> soluciones, figura[] figuras)
        {

            bool esSolucion = true;
            for (int k = 0; k < piezasEnTablero.Length; k++)
                if (piezasEnTablero[k] == null)
                {
                    esSolucion = false;
                    break;
                }
            if (esSolucion)
            {
            /*    
                string[] sol = tab.getTab();
                bool esta = false;
                for (int q = 0; q < 4; q++)
                {
                    if(soluciones.Contains(sol[q])){
                        esta = true;
                        break;
                    }

                }
                if (!esta)
                {
                    cantSoluciones++;
                    soluciones.Add(sol[0]);
                    //Console.WriteLine("Solucion " + cantSoluciones);
                    //tab.printTab();
                }
        
              */
                cantSoluciones++;
                string[] sol = tab.getTab();
                
                soluciones.Add(sol[0]);
                //Console.WriteLine("Solucion " + cantSoluciones);
                //Console.WriteLine(sol[0]);
                //tab.printTab();

            }
            else
            {
                if (tab.getCasilla(coord) > 0)
                {
                    coordenadas coordLibres = coord.getNext();
                    Backtracking.backtracking(tab, coordLibres, piezasEnTablero, ref cantSoluciones, soluciones, figuras);
                }
                else
                {
                    for (int i = 1; i <= piezasEnTablero.Length; i++)
                    {
                        if (piezasEnTablero[i - 1] == null)//if(piza sin utilizar)
                        {
                            coordenadas[][] posiciones = figuras[i - 1].getPosiciones();
                            //posiciones es una lista de posibles rotaciones de esta ficha


                            for (int j = 0; j < posiciones.Length; j++)
                            //para esta coordenada y esta pieza, trato de ponerla en todas sus posibles posiciones
                            {
                                bool puseFicha = false;
                                //if (tab.putFicha(fig, coord))
                                piezasEnTablero[i - 1] = tab.putFichaV2(posiciones[j], coord, i);
                                if (piezasEnTablero[i - 1] != null)
                                //si la pieza en esta posicion entra:
                                {

                                    puseFicha = true;
                                    //tab.printTab();
                                    coordenadas coordLibres = coord.getNext();
                                    Backtracking.backtracking(tab, coordLibres, piezasEnTablero, ref cantSoluciones, soluciones, figuras);
                                }
                                if (puseFicha)
                                {
                                    tab.pullFichaV2(piezasEnTablero[i - 1]);
                                    piezasEnTablero[i - 1] = null;

                                }
                            }
                        }
                    }
                }
            }


                
            

            
                
                
        }
    }
}
